
"""

这个 `BatchUniversalToMarkdownProcessor` 类具有以下特点：

1. 它接受输入文件夹和输出文件夹作为参数。

2. 它会检查输入文件夹是否存在，并确保输出文件夹存在。

3. 它遍历输入文件夹中的所有文件，保持原有的目录结构。

4. 对于每个文件，它会：
   - 确保输出文件的父目录存在
   - 检查文件大小，跳过过小的文件
   - 使用 `UniversalToMarkdownProcessor` 处理文件
   - 捕获并记录任何处理过程中的异常

5. 在处理完所有文件后，它会输出所有遇到的异常。

6. 它提供了一个命令行接口，可以直接从命令行运行批处理。

7. 它也可以在Python代码中直接使用。




这个实现提供了一个强大的工具，可以批量处理多种格式的文档，将它们转换为Markdown格式。
它保持了原有的目录结构，处理了可能的异常，并提供了清晰的输出信息。

"""



import os
from typing import Dict, Any
from pathlib import Path
from .universal_to_markdown import UniversalToMarkdownProcessor


class BatchUniversalToMarkdownProcessor:
    def __init__(self, input_folder: str, output_folder: str, options: Dict[str, Any] = {}):
        self.input_folder = Path(input_folder)
        self.output_folder = Path(output_folder)
        self.options = options
        self.errors = []

    def process(self):
        # 检查输入文件夹是否存在
        if not self.input_folder.exists():
            raise FileNotFoundError(f"Input folder not found: {self.input_folder}")

        # 确保输出文件夹存在
        self.output_folder.mkdir(parents=True, exist_ok=True)

        # 遍历输入文件夹
        for root, _, files in os.walk(self.input_folder):
            for file in files:
                input_file = Path(root) / file
                filename = os.path.basename(input_file)
                # 检查文件名是否以 "." 开头 ,如果是的话，直接跳过
                if filename.startswith('.') :
                    continue
                relative_path = input_file.relative_to(self.input_folder) 
                 # 保留原始扩展名并添加 .md
                output_file = self.output_folder / f"{relative_path}.md"
                #output_file = self.output_folder / relative_path.with_suffix('.md')

                try:
                    self._process_single_file(input_file, output_file)
                except Exception as e:
                    self.errors.append(f"Error processing {input_file}: {str(e)}")

        # 输出所有异常
        if self.errors:
            print("Errors encountered during processing 处理过程之中遇到的错误信息:")
            for error in self.errors:
                print(error)

    def _process_single_file(self, input_file: Path, output_file: Path):
        # 确保输出文件的父目录存在
        output_file.parent.mkdir(parents=True, exist_ok=True)

        # 检查文件大小
        if input_file.stat().st_size < 100:  # 假设小于100字节的文件为空或无意义
            print(f"Skipping small file: {input_file}")
            return

        # 使用UniversalToMarkdownProcessor处理文件
        processor = UniversalToMarkdownProcessor(str(input_file), str(output_file), self.options)
        result = processor.process()

        # 检查处理结果
        if not result['success']:
            raise Exception(result['error'])

        print(f"Successfully processed: {input_file} -> {output_file}")

def test(arg={}):
    # Usage example
    input_folder = "input_documents"
    output_folder = "output_markdown"

    batch_processor = BatchUniversalToMarkdownProcessor(input_folder, output_folder)
    batch_processor.process()

if __name__ == "__main__":
    import argparse

    parser = argparse.ArgumentParser(description="Batch convert documents to Markdown.")
    parser.add_argument("-i", "--input", required=True, help="Input folder containing documents")
    parser.add_argument("-o", "--output", required=True, help="Output folder for Markdown files")
    args = parser.parse_args()

    batch_processor = BatchUniversalToMarkdownProcessor(args.input, args.output)
    batch_processor.process()

"""
使用示例：
python3 -m document2llm.md.batch_universal_to_markdown -i input_documents -o output_markdown


python3 -m document2llm.md.batch_universal_to_markdown -i test-input-folder  -o output_markdown_folder

或者在Python代码中：

from document2llm.md.batch_universal_to_markdown import BatchUniversalToMarkdownProcessor

batch_processor = BatchUniversalToMarkdownProcessor("input_documents", "output_markdown")
batch_processor.process()
"""


#
